package demo.DataStrucAndAlgo.SingletonPattern.Prototype;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/13-08-13-14:41
 * @Description：demo.DataStrucAndAlgo.SingletonPattern.Prototype
 */
/*
原型模式
    用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象，用于创建重复的对象，同时又能保证性能，属于创建型模式，
    实现了一个原型接口，该接口用于创建当前对象的克隆，当直接创建对象的代价比较大时则采用这种模式。
    例如，一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象，在下一个请求时返回
    它的克隆，在需要的时候更新数据库，以此来减少数据库调用

    实现克隆操作，在java实现Cloneable接口，重写clone()，在NET中可以使用Object类的MemberwiseClone()方法来实现
    对象的浅拷贝或通过序列化的方式来实现深拷贝。
    原型模式同样用于隔离类对象的使用者和具体类型（易变类）之间的耦合关系，它同样要求这些易变类拥有稳定的接口。

    克隆的浅拷贝
        1）对于数据类型是基本数据类型的成员变量，浅拷贝会直接进行值传递，也就是将该属性值复制一份给新的对象
        2）对于数据类型是引用数据类型的成员变量，比如说成员变量是某个数组、某个类的对象等，那么浅拷贝会进行引用传递，也就是只是将该成员变量的引用值（内存地址）复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下，在一个对象中修改该成员变量会影响到另一个对象的该成员变量值
        3）克隆羊就是浅拷贝
        4）浅拷贝是使用默认的 clone 方法来实现：sheep=(Sheep)super.clone();
     深拷贝
        1）复制对象的所有基本数据类型的成员变量值
        2）为所有引用数据类型的成员变量申请存储空间，并复制每个引用数据类型成员变量所引用的对象，直到该对象可达的所有对象。也就是说，对象进行深拷贝要对整个对象进行拷贝
        3）深拷贝实现方式 1：重写 clone 方法来实现深拷贝
        4）深拷贝实现方式 2：通过对象序列化实现深拷贝
 */
public class Prototype {

}
